package com.yunxi.service.localService.otd;

import com.yunxi.core.service.IServicePlus;
import com.yunxi.core.web.ApiResult;
import com.yunxi.hubToBiz.pojo.PackageConstraintVO;
import com.yunxi.model.otd.VehicleConfigConstraint;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 * 整车配置约束规则 服务类
 * </p>
 *
 * @author XUQI
 * @since 2019-08-05
 */
public interface VehicleConfigConstraintService extends IServicePlus<VehicleConfigConstraint> {


    /**
     * 查询所有可用的约束规则
     * @return  List<VehicleConfigConstraint>
     */
    List<VehicleConfigConstraint> findEnableConfigConstraint(String modelCode);

    /**
     * 查询所有可用的约束规则按车型分类
     *
     * @return Map<String, List < VehicleConfigConstraint>>
     */
    Map<String, List<VehicleConfigConstraint>> findEnableConfigConstraintMap();

    /**
     * 根据约束关系调整默认工程配置
     * @param constraints 约束关系
     * @param configMap 默认配置
     * @param allConfigMap 所有配置
     */
    void replaceConfig(List<VehicleConfigConstraint> constraints, Map<String, String> configMap,
        Map<String, String> allConfigMap);


    /**
     * BOM to PMS  Config Constraint
     * @param dataList data
     * @return ApiResult
     */
    ApiResult receiveBomData(List<PackageConstraintVO> dataList);


    /**
     * 校验单车配置是否满足条件
     *
     * @param condition 条件
     * @param configMap 单车配置 Map<key:特征族,value:特征值>
     * @return true or false
     */
    boolean checkIsMeet(String condition, Map<String, String> configMap);

    /**
     * 查询与选装包A互斥的其他选装包
     * @param packages 选装包A
     * @return  互斥的其他选装包
     */
    ApiResult findExcludeCustomPackCode(List<String> packages);


    /**
     * 根据特征族判断所选选装包是否存在互斥
     * @param packages 选装包:  XZAB,XZAC
     * @return  是否存在互斥
     */
    boolean checkExcludeCustomPackCode(List<String> packages, String vehicleCode);

    /**
     * 根据约束规则判断所选选装包是否存在互斥
     * @param packages 选装包:  XZAB,XZAC
     * @return  是否存在互斥
     */
    boolean checkExcludeCustomPackCodeByConstraint(List<String> packages);

    /**
     * 验证选装包是否正确
     *
     * @param packages 选装包
     */
    void checkIsCustomPackCode(List<String> packages, String vehicleCode);

    /**
     *  根据 featureCode 查询必选选装包
     * @param featureCode （颜色Code）
     * @return 必选选装包
     */
    Map<String, List<Object>> findRequiredPackagesByFeatureCode(List<String> featureCode, String vehicleCode);
}
